// Copyright 2017 The PDFium Authors
当然，以下是`CPDF_CMapParser`类中各个函数和成员变量的功能概述：

### 公有成员函数(Public Member Functions)

1. * *`explicit CPDF_CMapParser(CPDF_CMap * pCMap);`* *
-构造函数：使用给定的`CPDF_CMap`对象初始化`CPDF_CMapParser`实例。`pCMap`是指向`CPDF_CMap`对象的指针，表示要解析的CMap。

2. * *`~CPDF_CMapParser();`* *
-析构函数：清理`CPDF_CMapParser`实例所占用的资源。

3. * *`void ParseWord(ByteStringView word);`* *
-解析一个单词（word）。`word`是一个`ByteStringView`类型的参数，表示要解析的单词。这个方法用于处理CMap文件中的每个单词，并根据当前解析状态更新CMap数据。

4. * *`static CIDSet CharsetFromOrdering(ByteStringView ordering);`* *
-根据给定的排序规则（ordering）确定字符集（charset）。`ordering`是一个`ByteStringView`类型的参数，表示排序规则。返回一个`CIDSet`枚举值，表示字符集的类型。

### 私有成员函数(Private Member Functions)

1. * *`void HandleCid(ByteStringView word);`* *
-处理与CID相关的单词。`word`是一个`ByteStringView`类型的参数，表示要处理的单词。这个方法用于解析CMap文件中的CID定义，并更新CMap的CID映射。

2. * *`void HandleCodeSpaceRange(ByteStringView word);`* *
-处理代码空间范围（CodeSpaceRange）相关的单词。`word`是一个`ByteStringView`类型的参数，表示要处理的单词。这个方法用于解析CMap文件中的代码空间范围定义，并更新CMap的代码空间范围。

3. * *`static uint32_t GetCode(ByteStringView word);`* *
-从给定的单词中提取字符码（code）。`word`是一个`ByteStringView`类型的参数，表示要解析的单词。返回一个32位整数，表示提取的字符码。

4. * *`static std::optional<CPDF_CMap::CodeRange> GetCodeRange(ByteStringView first, ByteStringView second);`* *
-从两个单词中提取代码范围（CodeRange）。`first`和`second`是`ByteStringView`类型的参数，表示要解析的两个单词。返回一个`std::optional<CPDF_CMap::CodeRange>`对象，表示提取的代码范围。如果解析失败，则返回`std::nullopt`。

### 私有成员变量(Private Member Variables)

1. * *`enum Status{ ... } m_Status = kStart;`* *
-定义并存储解析状态。`Status`是一个枚举类型，表示当前解析的状态。初始状态为`kStart`，表示解析尚未开始。

2. * *`int m_CodeSeq = 0;`* *
-存储当前解析的代码序列号。用于跟踪解析过程中遇到的字符码顺序。

3. * *`UnownedPtr<CPDF_CMap > const m_pCMap;`* *
-存储指向`CPDF_CMap`对象的非拥有指针。用于在解析过程中访问和更新CMap数据。

4. * *`std::vector<CPDF_CMap::CodeRange> m_Ranges;`* *
-存储已解析的代码范围（CodeRange）。每个`CodeRange`对象定义了一组字符码范围。

5. * *`std::vector<CPDF_CMap::CodeRange> m_PendingRanges;`* *
-存储待处理的代码范围（CodeRange）。用于处理多行或多段定义的代码范围。

6. * *`std::vector<CPDF_CMap::CIDRange> m_AdditionalCharcodeToCIDMappings;`* *
-存储额外的字符码到CID的映射。每个`CIDRange`对象定义了一组字符码范围及其对应的CID。

7. * *`ByteString m_LastWord;`* *
-存储上一次解析的单词。用于处理需要跨多个单词解析的情况，如代码范围定义。

8. * *`std::array<uint32_t, 4> m_CodePoints = {};`* *
-存储最多4个字符码点。用于处理多字节字符码的解析。

### 功能概述

`CPDF_CMapParser`类用于解析PDF文档中的CMap（字符映射表）文件。CMap文件定义了字符编码到CID（字符标识符）的映射关系，从而实现字符的正确显示和渲染。`CPDF_CMapParser`类提供了以下功能：

- **解析CMap文件 * *：通过`ParseWord`方法逐词解析CMap文件内容，并根据当前解析状态更新CMap数据。
- **处理CID定义 * *：通过`HandleCid`方法解析CMap文件中的CID定义，并更新CMap的CID映射。
- **处理代码空间范围 * *：通过`HandleCodeSpaceRange`方法解析CMap文件中的代码空间范围定义，并更新CMap的代码空间范围。
- **提取字符码和代码范围 * *：通过`GetCode`和`GetCodeRange`方法从单词中提取字符码和代码范围，用于构建CMap的映射关系。
- **管理解析状态 * *：通过`Status`枚举和相关成员变量管理解析过程中的状态，确保解析逻辑的正确性和一致性。

这些函数和成员变量共同工作，以实现对CMap文件的高效解析，确保字符编码到CID的映射关系被正确加载和应用。`CPDF_CMapParser`类是PDFium库中处理CMap文件的核心组件之一，对于支持多种语言和字符集的PDF文档至关重要。// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_FPDFAPI_FONT_CPDF_CMAPPARSER_H_
#define CORE_FPDFAPI_FONT_CPDF_CMAPPARSER_H_

#include <array>
#include <optional>
#include <utility>
#include <vector>

#include "core/fpdfapi/font/cpdf_cidfont.h"
#include "core/fpdfapi/font/cpdf_cmap.h"
#include "core/fxcrt/unowned_ptr.h"

class CPDF_CMapParser {
 public:
  explicit CPDF_CMapParser(CPDF_CMap* pCMap);
  ~CPDF_CMapParser();

  void ParseWord(ByteStringView word);

  static CIDSet CharsetFromOrdering(ByteStringView ordering);

 private:
  friend class CPDFCMapParserTest_GetCode_Test;
  friend class CPDFCMapParserTest_GetCodeRange_Test;

  enum Status {
    kStart,
    kProcessingCidChar,
    kProcessingCidRange,
    kProcessingRegistry,
    kProcessingOrdering,
    kProcessingSupplement,
    kProcessingWMode,
    kProcessingCodeSpaceRange,
  };

  void HandleCid(ByteStringView word);
  void HandleCodeSpaceRange(ByteStringView word);

  static uint32_t GetCode(ByteStringView word);
  static std::optional<CPDF_CMap::CodeRange> GetCodeRange(
      ByteStringView first,
      ByteStringView second);

  Status m_Status = kStart;
  int m_CodeSeq = 0;
  UnownedPtr<CPDF_CMap> const m_pCMap;
  std::vector<CPDF_CMap::CodeRange> m_Ranges;
  std::vector<CPDF_CMap::CodeRange> m_PendingRanges;
  std::vector<CPDF_CMap::CIDRange> m_AdditionalCharcodeToCIDMappings;
  ByteString m_LastWord;
  std::array<uint32_t, 4> m_CodePoints = {};
};

#endif  // CORE_FPDFAPI_FONT_CPDF_CMAPPARSER_H_
